#ifndef _BSP_STIMER_H_
#define _BSP_STIMER_H_

#include "bsp.h"


// Multi SoftTImer 多组软件定时器 -----------------------------------------------------------------------------------
/**
 * @brief 定义平台时钟函数类型。
 * 这个类型定义了一个指向平台时钟函数的指针。该函数不接受任何参数，并返回一个 `int32_t` 类型的值，通常用来获取系统的当前时钟或计时器的值。
 */
typedef int32_t (*PlatformTicksFunction_t)(void);

/**
 * @brief 定义定时器句柄结构体类型。
 * MultiTimer 是一个结构体，表示一个定时器句柄，包含了定时器的状态信息、到期时间、回调函数等。
 */
typedef struct MultiTimerHandle MultiTimer;

/**
 * @brief 定义定时器回调函数类型。
 * 当定时器到期时，执行此回调函数。回调函数会接收定时器句柄和用户数据作为参数。
 */
typedef void (*MultiTimerCallback_t)(MultiTimer* timer, void* userData);

/**
 * @brief 定时器结构体。 
 * 该结构体表示一个定时器的具体信息，包括定时器的到期时间、回调函数、用户数据以及下一个定时器的指针。
 */
struct MultiTimerHandle {
    MultiTimer* next;               ///< 指向下一个定时器的指针。
    uint32_t deadline;              ///< 定时器的到期时间。
    MultiTimerCallback_t callback;  ///< 定时器到期时调用的回调函数。
    void* userData;                ///< 用户数据，可以在回调函数中使用。
};

int multiTimerInstall(PlatformTicksFunction_t ticksFunc);
int multiTimerStart(MultiTimer* timer, uint32_t timing, MultiTimerCallback_t callback, void* userData);
int multiTimerStop(MultiTimer* timer);
int multiTimerYield(void);

/**
 * @brief 软件定时器驱动接口结构体。
 * 该结构体定义了软件定时器的操作接口，包括初始化、启动、停止和循环检查等功能。
 */
typedef struct 
{
    int (*pf_init)(PlatformTicksFunction_t ticksFunc);       ///< 初始化平台时钟函数
    int (*pf_start)(MultiTimer* timer, uint32_t timing, MultiTimerCallback_t callback, void* userData); ///< 启动定时器
    int (*pf_stop)(MultiTimer* timer);                        ///< 停止定时器
    int (*pf_loop)(void);                                     ///< 循环检查定时器是否到期并执行回调

} MultiTimer_driver_t;

// 定义软件定时器驱动实例，供外部调用。
extern MultiTimer_driver_t g_bsp_multitimer_inst;

// END ----------------------------------------------------------------------------------------------------------------------------------

#endif
